GLFLによるOpenGL入門:第4章 プログラマブル・シェーダ
from GLFLによるOpenGL入門
第4章 プログラマブル・シェーダ
「画像」の生成
rasterizerによるラスタライズ
レンダリングパイプライン
昔は頂点処理や画素処理は変更できない処理だった(固定機能シェーダ)
最近は頂点処理と画素処理のハードウェアがプラグラマブルになった(プログラマブル・シェーダ)
シェーディング言語
プログラマブルシェーダはいくつかのシェーダを複合して構成する
最も単純構成
頂点処理 vertex shader
画素処理 フラグメントシェーダ(pixel shader)
さらにいくつかを組み合わせることがある
GLSL のシェーダプログラムを利用する手順は、次のようになります。 p.54
(1) glCreateProgram() 関数によってプログラムオブジェクトを作成します。
(2) glCreateShader() 関数によってバーテックスシェーダとフラグメントシェーダのシェーダ
オブジェクトを作成します。
(3) glShaderSource() 関数によって、作成したそれぞれのシェーダオブジェクトに対してソー
スプログラムを読み込みます。
code:頂点の位置をそのまま次のステージに送るvertex shader.cpp
#version 150 core // GLSL ver 1.5, Core Profile
in vec4 position; // in変数(変数名position)はCPUから送られた図形データの1頂点データが格納される。頂点属性という。
void main()
{
gl_Position = position // この変数に代入した値がパイプラインの次のステージに送られる
}
(4) glCompileShader() 関数によって読み込んだソースプログラムをコンパイルします。
(5) glAttachShader() 関数によってプログラムオブジェクトにシェーダオブジェクトを組み込
みます。
(6) glLinkProgram() 関数によってプログラムオブジェクトをリンクします。
基素.iconなににリンクするの?
シェーダーオブジェクトかな
以上の処理によりシェーダのプログラムオブジェクトが作成されますから、図形を描画する前
に glUseProgram() 関数を実行して、図形の描画にこのシェーダプログラムを使うようにします。
頂点のデータ=頂点属性(attribute)が格納されるin変数をattribute変数という
swizzling
頂点属性は CPU から一旦 GPU が管理する頂点バッファオブジェクトと呼ばれるメモリに格納します。
グラフィックスメモリかな?基素.icon
GPUが管理するの頂点バッファじゃないかな?p.73との生合成が取れない基素.icon
その後 CPU から描画命令 (ドローコール) を送ると、GPU は頂点バッファオブジェクトから頂点ごとに頂点属性を取り出して attribute 変数に格納し、バーテックスシェーダの処理を実行します。
gl_Position は GLSL の組み込み変数で、この変数に代入した値がパイプラインの次のステージに送られます。バーテックスシェーダは必ずこの変数に値を代入しなければなりません。
vertex shaderは座標変換するのだから最終的に座標が確定しなければいけないということ基素.icon
rasterizerはfragment shaderの処理を実行する
code:fragment shader.cpp
#version 150 core
out vec4 fragment; // この変数に格納したデータが次のステージに送られる。フレームバッファのカラーバッファに格納される
void main()
{
fragment = vec4(1.0, 0.0, 0.0, 1,0); // rgba
}
画素を書かない場合discard命令を実行する
では、これらのshaderをどうやってパイプラインに組み込めばいいのか?
文字列を行に分割して配列に文字列にして渡す
うーん、汚い基素.icon
その後別ファイルに読み込ませるコードがあった
この時点ではシェーダーをつかっていないのであっているのかわからないのが玉に瑕
p.56
形状の表現
背面カリング
デプスバッファ法
陰影付け
二色性反射モデル